package teaching.models;

import teaching.data.LearningSet;
import teaching.data.Vecteur;
import teaching.tools.Draw;

public class PerceptronBase implements ScoringFunction{
	Vecteur theta;
	int nb_iter = 1000;
	double pas = 0.001;
	
	public PerceptronBase(int size){
		theta = new Vecteur(size);
	}
	
	public void learn(LearningSet s)
	{
		for (int i=1 ; i<=nb_iter ; i++){
			int fini = 1;
			double accur = 0;
			Vecteur tempo = new Vecteur(theta.size());
			for (int z=0;z<tempo.size();z++){
				tempo.setValue(z, 0);	
			}
			for (int j=0 ; j<s.size(); j++)
			{
				if (s.getLabel(j) * theta.computeDOTProduct(s.getVector(j)) <= 0)
						{
							Vecteur temp = new Vecteur(s.getVector(j));
							temp.product((pas*10./i)*s.getLabel(j));
							theta.add(temp);
							fini = 0;
						}
				else{
					accur++;
				}
			}
			if (fini == 1){break;}
			if (i%10 == 0 || i==1){
				System.out.println(i+" Accuracy is : "+(accur/s.size())+" ");
				System.out.println("vecteur theta = ("+theta+") de taille "+theta.size());
			}
			/**System.out.println("")*/
		}
	
	}
	
	@Override
	public double getScore(Vecteur v) {
		if (theta.computeDOTProduct(v) > 0)
		{
			return(1);
		}
		return(-1);
	}
}
